-
Notifications
You must be signed in to change notification settings - Fork 382
Add custom deleter support to UniquePtr #1305
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Add the possibility to use shared trivial types as deleters for objects managed by std::unique_ptr / UniquePtr.
ed5d2e5
to
8336f62
Compare
GCC does not accept an extern "C" storage class specifier along with definition of the global variable. Split declaration and definition to overcome this.
Apparently MacOS's unique_ptr implementation puts the deleter as the 2nd member. Reflect this in the unique_ptr definition.
* Add unnamed lifetimes to drop implementation for UniquePtrTarget * Update expected stderr to include the deleter type parameter.
@dtolnay Does this PR have chances to be merged as-is or is there still something I need to do with it in order to get it merged? |
Well, now this guy has a merge conflict. It shouldn't be a big deal to fix it but is it really worth it? Was it laying around for such a long time because the change is bad? If yes, please tell me. On a more general side, is it worth that I also add allocator support to vector and shared_ptr? Probably not because I feel that for some reason there is no chance of such changes to ever getting merged. If that is due to lack of time I'd be glad to help here. There's a lot of pending PRs that would be embraced by the community and maybe a lot of stuff that people would be willing to contribute I guess. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR!
#[cfg(not(target_os = "macos"))] | ||
#[repr(C)] | ||
struct UniquePtrInner<T, D> { | ||
deleter: D, | ||
repr: MaybeUninit<*mut c_void>, | ||
ty: PhantomData<T>, | ||
} | ||
|
||
impl<T> UniquePtr<T> | ||
#[cfg(target_os = "macos")] | ||
#[repr(C)] | ||
struct UniquePtrInner<T, D> { | ||
repr: MaybeUninit<*mut c_void>, | ||
deleter: D, | ||
ty: PhantomData<T>, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not something I am willing to assume about the internal layout of std::unique_ptr.
Can you suggest some other way to implement this feature?
I am pretty confident that this general approach is not a good fit for this library. Depending on exactly how you were planning to use this, I can recommend some alternatives:
|
Add the possibility to use shared trivial types as deleters for objects managed by std::unique_ptr / UniquePtr.